// 1.提取头部元素
type Arr = ['a', 'b', 'c']
type First<T extends any[]> = T extends [infer First, ...any[]] ? First : []
type a = First<Arr>
//类型参数 T 通过extends 约束 只能是数组类型，然后通过infer 声明局部 First 变量做提取
// 后面的元素可以是任意类型，然后把局部变量返回
// 2.提取尾部元素
type Arr = ['a', 'b', 'c']
type Last<T extends any[]> = T extends [...any[], infer Last,] ? Last : []
type c = Last<Arr>
// 3.剔除第一个元素 Shift
type Arr = ['a', 'b', 'c']
type First<T extends any[]> = T extends [unknown, ...infer Rest] ? Rest : []
type a = First<Arr>
// 思路就是 我们除了第一个的元素把其他的剩余元素声明成一个变量 直接返回 就实现了我们的要求 剔除第一个元素
// 4.剔除尾部元素 pop
type Arr = ['a', 'b', 'c']
type First<T extends any[]> = T extends [...infer Rest, unknown] ? Rest : []
type a = First<Arr>